import type { RouteRecordRaw } from 'vue-router'

// 所有页面模块
const modules = import.meta.glob('@/views/**/*.vue')
console.log('modules:', modules)


/**
 * 菜单权限数据转换工具，将扁平结构的数据转换为树形结构的数据
 */
export const transToTree = (list: IPermission[]) => {
  // 为避免对源数据产生干扰，将参数 list 进行复制
  const copyList: IPermission[] = JSON.parse(JSON.stringify(list))
  // 结果数组
  const result: IPermission[] = []
  // Map 对象
  const map = new Map()
  // 将源数据放入到 Map 对象中，以数据项的 id 作为key，以数据项本身作为 value
  copyList.forEach(item => map.set(item.id, item))

  // 遍历源数据，将数据项放入到对应的父节点的 children 数组中
  copyList.forEach(item => {
    // 获取当前遍历项的父节点
    const parent = map.get(item.pid)
    // 如果父节点存在，则将当前遍历项放入到父节点的 children 数组中
    if (parent) {
      (parent.children || (parent.children = [])).push(item)
    } else {
      result.push(item)
    }
  })
  return result
}

/**
 * 工具函数: 找出树形结构中的所有叶子节点，判断权限列表中的id是否与叶子节点中的id一致
 */
export const getLeafNodeKeys = (tree: IPermission[], permissionIds: string[]) => {
  // 结果集
  const result: IPermission[] = []

  /**
   * 递归查找叶子节点
   * @param node 当前节点
   */
  const getLeaf = (node: IPermission) => {
    // 如果当前节点没有子节点，则将其放入到结果数组中
    if (!node.children || node.children.length === 0) {
      result.push(node)
    } else {
      // 否则，递归调用 getLeaf 函数，遍历当前节点的子节点
      node.children.forEach(child => getLeaf(child))
    }
  }

  // 遍历树形结构，调用 getLeaf 函数
  tree.forEach(node => getLeaf(node))

  // 过滤掉叶子节点中不存在于权限列表中的节点，并返回
  return result.filter(item => permissionIds.includes(item.id)).map(item => item.id)
}

/**
 * 根据树形菜单生成菜单路由表
 */
export const generateMenuRoutes = (tree: IPermission[]) => {
  // 递归生成路由表
  const generateRoute = (tree: IPermission[]): RouteRecordRaw[] => {
    return tree.map(item => {
      // 创建路由对象
      const route: any = {
        path: item.rule,
        component: modules[`/src/views${item.rule}.vue`] || modules[`/src/views${item.rule}/index.vue`] || modules[`/src/views/temp/index.vue`],
        meta: {
          title: item.name
        }
      }
      if (item.children && item.children.length > 0) {
        // 如果当前节点有子节点，则递归调用 generateRoute 函数，生成子路由表
        route.children = generateRoute(item.children)
      }

      return route
    })
  }

  return generateRoute(tree)
}
